// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

const db = cloud.database()

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  const { phoneCode, userInfo = {} } = event

  try {
    console.log('微信手机号登录云函数开始执行...')
    console.log('接收参数:', { phoneCode, userInfo })

    // 1. 获取openid和unionid（云函数自动获取）
    const openid = wxContext.OPENID
    const unionid = wxContext.UNIONID
    console.log('微信上下文:', { openid, unionid })

    if (!openid) {
      throw new Error('未能获取到用户OpenID')
    }

    let phoneNumber = ''

    // 2. 如果有phoneCode，通过官方接口获取手机号
    if (phoneCode) {
      console.log('开始获取手机号，phoneCode:', phoneCode)
      try {
        const phoneResult = await cloud.openapi.phonenumber.getPhoneNumber({
          code: phoneCode
        })
        
        console.log('手机号获取结果:', phoneResult)
        if (phoneResult.errCode === 0 && phoneResult.phoneInfo) {
          phoneNumber = phoneResult.phoneInfo.phoneNumber
          console.log('成功获取手机号:', phoneNumber)
        } else {
          console.warn('获取手机号失败:', phoneResult.errMsg)
        }
      } catch (phoneError) {
        console.warn('获取手机号异常:', phoneError)
        // 继续执行，手机号可以为空
      }
    }

    // 3. 查询用户是否已存在（通过OpenID）
    console.log('查询用户是否存在，OpenID:', openid)
    const userQuery = await db.collection('users').where({
      _openid: openid
    }).get()

    let userData = null
    let isNewUser = false

    if (userQuery.data.length > 0) {
      // 用户已存在，更新用户信息
      console.log('用户已存在，更新用户信息')
      const existingUser = userQuery.data[0]
      
      const updateData = {
        unionid: unionid,
        nickName: userInfo.nickName || existingUser.nickName,
        avatarUrl: userInfo.avatarUrl || existingUser.avatarUrl,
        gender: userInfo.gender || existingUser.gender,
        updatedAt: new Date(),
        lastLoginAt: new Date()
      }

      // 如果获取到了手机号，则更新手机号
      if (phoneNumber) {
        updateData.phoneNumber = phoneNumber
      }

      await db.collection('users').doc(existingUser._id).update({
        data: updateData
      })

      userData = {
        ...existingUser,
        ...updateData
      }
      isNewUser = false

    } else {
      // 新用户，创建用户记录
      console.log('新用户，创建用户记录')
      const newUser = {
        _openid: openid,
        unionid: unionid,
        nickName: userInfo.nickName || '微信用户',
        realName: '',
        avatarUrl: userInfo.avatarUrl || '/images/icons/userAvatar.png',
        phoneNumber: phoneNumber || '', // 使用获取到的手机号
        gender: userInfo.gender || 0,
        birthday: '',
        memberLevel: 1, // 初始化为最低等级会员
        balance: 0,
        totalPoints: 0,
        totalConsumption: 0,
        paymentPassword: '', // 加密后的支付密码（初始为空，用户需要后续设置）
        passwordErrorCount: 0, // 密码错误次数（默认为0）
        lastPasswordErrorTime: null, // 最后一次密码错误的时间（可为null）
        createdAt: new Date(),
        updatedAt: new Date(),
        lastLoginAt: new Date(),
        status: 1 // 账号可用状态
      }

      const createResult = await db.collection('users').add({
        data: newUser
      })

      userData = {
        ...newUser,
        _id: createResult._id
      }
      isNewUser = true
    }

    // 4. 获取会员等级信息
    console.log('获取会员等级信息，等级:', userData.memberLevel)
    try {
      const memberLevelQuery = await db.collection('member_levels').where({
        level: userData.memberLevel
      }).get()

      if (memberLevelQuery.data.length > 0) {
        userData.memberLevelInfo = memberLevelQuery.data[0]
        console.log('会员等级信息获取成功')
      }
    } catch (levelError) {
      console.warn('获取会员等级信息失败:', levelError)
      // 不影响主流程，继续执行
    }

    console.log('登录流程完成，返回结果')
    return {
      success: true,
      data: userData,
      isNewUser: isNewUser,
      message: isNewUser ? '注册成功' : '登录成功',
      phoneNumber: phoneNumber // 返回手机号用于前端显示
    }

  } catch (error) {
    console.error('登录失败:', error)
    return {
      success: false,
      data: null,
      isNewUser: false,
      message: error.message || '登录失败，请重试'
    }
  }
}